<!DOCTYPE HTML>
<html>
<head>
<title>StringGetPos | AutoHotkey</title>
<meta name="description" content="The StringGetPos command retrieves the position of the specified substring within a string." />
<meta name="ahk:equiv-v2" content="lib/InStr.htm" />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>StringGetPos</h1>

<p>获取指定的子字符串在某个字符串中的位置.</p>
<p class="warning"><strong>过时的:</strong> 不推荐在新脚本中使用此命令. 请使用 <a href="InStr.htm">InStr</a> 函数代替.</p>

<pre class="Syntax"><span class="func">StringGetPos</span>, OutputVar, InputVar, SearchText <span class="optional">, Occurrence, Offset</span></pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>OutputVar</dt>
  <dd><p>用来存储获取的相对于 <em>InputVar</em> 首个字符的位置的输出变量的名称. StringGetPos 中首个字符的位置为 0, 而 <a href="InStr.htm">InStr()</a> 中首个字符的位置为 1.</p></dd>

  <dt>InputVar</dt>
  <dd><p>内容将被搜索的输入变量名. 不要把名称括在百分号中, 除非您希望使用变量的 <em>内容</em> 作为被解析的变量名.</p></dd>

  <dt>SearchText</dt>
  <dd><p>要搜索的字符串. 如果没有启用 <a href="StringCaseSense.htm">StringCaseSense</a>, 那么匹配过程不区分大小写.</p></dd>

  <dt>Occurrence</dt>
  <dd>
    <p>如果 <em>SearchText</em> 在 <em>InputVar</em> 中出现多次, 此参数影响那个将被找到. 如果省略此参数, 默认为 L1(意味着将从 <em>InputVar</em> 左边开始查找首个匹配). 要更改此行为, 请指定以下选项之一:</p>
    <p><strong>L<em>n</em>:</strong> 从 <em>InputVar</em> 的左边开始搜索, 并继续向右直到找到第 <em>n</em> 个匹配.</p>
    <p><strong>R<em>n</em>:</strong> 从 <em>InputVar</em> 的右边开始搜索, 并继续向左直到找到第 <em>n</em> 个匹配. 如果 <em>n</em> 省略(或 <em>Occurrence</em> 参数为 1), 默认为 R1. </p>
    <p>例如, 要找到从右边开始的第四个匹配, 请指定 R4. 注意: 如果 <em>n</em> 小于或等于零, 将找不到匹配.</p>
  </dd>

  <dt>Offset</dt>
  <dd><p>最左边或最右边(取决于上面的参数) 需要跳过的字符数. 省略时默认为 0. 例如, 后面的语句会从左边的第十个字符开始查找:<code>StringGetPos, OutputVar, InputVar, abc, , 9</code>. 此参数可以为<a href="../Variables.htm#Expressions">表达式</a>.</p></dd>

</dl>

<h2 id="ErrorLevel">ErrorLevel</h2>
<p>在 <em>InputVar</em> 中的指定位置没有找到 <em>SearchText</em> 时 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被置为 1, 否则为 0.</p>
<h2 id="Remarks">备注</h2>
<p>与 <a href="StringMid.htm">StringMid</a> 和 <a href="InStr.htm">InStr()</a> 不同, StringGetPos 中首个字符的位置为 0.</p>
<p>获取的位置总是相对于 <em>InputVar</em> 的首个字符, 不受 <em>Occurrence</em> 和/或 <em>Offset</em> 的值影响. 例如, 如果在 123abc789 中查找 "abc", 那么获取的位置总为 3, 而不论查找的参数如何.</p>
<p>如果 <em>SearchText</em> 不存在于 <em>InputVar</em> 中的指定出现位置, 那么 <em>OutputVar</em> 将被置为 -1 且 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被置为 1.</p>
<p>使用 <a href="SplitPath.htm">SplitPath</a> 可以更容易地将文件路径分解为目录, 文件名和扩展名.</p>
<p>内置变量 <a href="../Variables.htm">%A_Space%</a> 和 <a href="../Variables.htm">%A_Tab%</a> 分别包含了单个空格和单个 tab 字符. 当您需要搜索单独的空格或 tab 或在 <em>SearchText</em> 的开始或末尾含有空格或 tab 时, 这很有用.</p>
<h2 id="Related">相关</h2>
<p><a href="InStr.htm">InStr()</a>, <a href="RegExMatch.htm">RegExMatch()</a>, <a href="IfInString.htm">IfInString</a>, <a href="IfIn.htm">if var in/contains MatchList</a>, <a href="StringCaseSense.htm">StringCaseSense</a>, <a href="StringReplace.htm">StringReplace</a>, <a href="SplitPath.htm">SplitPath</a>, <a href="StringLeft.htm">StringLeft</a>, <a href="StringLeft.htm">StringRight</a>, <a href="StringMid.htm">StringMid</a>, <a href="StringTrimLeft.htm">StringTrimLeft</a>, <a href="StringTrimLeft.htm">StringTrimRight</a>, <a href="StringLen.htm">StringLen</a>, <a href="StringLower.htm">StringLower</a>, <a href="StringLower.htm">StringUpper</a>, <a href="IfIs.htm">if var is type</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a class="ex_number" href="#ExBasic"></a> 检索和分析一个子字符串的位置.</p>
<pre>Haystack := "abcdefghijklmnopqrs"
Needle := "def"
StringGetPos, pos, Haystack, %Needle%
if (pos &gt;= 0)
    MsgBox, The string was found at position %pos%.</pre>
</div>

<div class="ex" id="ExSplitPath">
<p><a class="ex_number" href="#ExSplitPath"></a> 把文件的完整路径名分解成各个部分. 注意使用 <a href="StrSplit.htm">StrSplit()</a>, <a href="StringSplit.htm">StringSplit</a> 或<a href="LoopParse.htm">解析循环</a>会更容易, 这里只是为了演示.</p>
<pre>FileSelectFile, file, , , Pick a filename in a deeply nested folder:
if (file != "")
{
    pos_prev := StrLen(file)
    pos_prev += 1 <em>; 改变位置到最后一个字符的后面.</em>
    Loop
    {
        <em>; 从右边开始查找第 N 个匹配:</em>
        StringGetPos, pos, file, \, R%A_Index%
        if ErrorLevel
            break
        length := pos_prev - pos - 1
        pos_prev := pos
        pos += 2  <em>; 进行调整以便使用 StringMid.</em>
        StringMid, path_component, file, %pos%, %length%
        MsgBox Path component #%A_Index% (from the right) is:`n%path_component%
    }
}</pre>
</div>

</body>
</html>